package malagaAcoge.controller.daos;

import java.util.ArrayList;
import java.util.List;

import javax.persistence.EntityManager;
import javax.persistence.Query;

import malagaAcoge.model.entities.Departamento;
import malagaAcoge.utils.JPAUtils;

public class DepartamentoDao {
	private static JPAUtils jpaUtils;
	protected static EntityManager em;

	public DepartamentoDao() {
		jpaUtils = new JPAUtils();

	}

	@SuppressWarnings("unchecked")
	public static List<Departamento> findAll() {
		List<Departamento> departamentos = new ArrayList<Departamento>();
		try {
			em = jpaUtils.getEntityManager();
			Query q = em.createQuery("select d from Departamento d");
			departamentos = q.getResultList();
		} catch (Exception e) {
			System.out.println("Error en metodo findAllDepartamento");
			e.printStackTrace();
		} finally {
			em.close();
		}
		return departamentos;

	}

	public static Departamento findDepartamento(int id) {
		Departamento Departamento = null;
		try {
			em = jpaUtils.getEntityManager();
			Departamento = (Departamento) em.find(Departamento.class, id);
		} catch (Exception e) {
			System.out.println("Error en metodo findDepartamento");
			e.printStackTrace();
		} finally {
			em.close();
		}
		return Departamento;

	}

	public static Departamento findDepartamentoByNombre(String nombre) {
		Departamento Departamento = null;
		try {
			em = jpaUtils.getEntityManager();
			Departamento = (Departamento) em
					.createQuery(
							"SELECT OBJECT(Departamento) FROM Departamento Departamento WHERE Departamento.nombre = :nombre")
					.setParameter("nombre", nombre).getSingleResult();

		} catch (Exception e) {
			System.out.println("Error en metodo findDepartamentoByAccessData");
			e.printStackTrace();
		} finally {
			em.close();
		}
		return Departamento;

	}

	public static void createDepartamento(Departamento Departamento) {
		try {
			em = jpaUtils.getEntityManager();
			em.getTransaction().begin();
			em.persist(Departamento);
			em.getTransaction().commit();
		} catch (Exception e) {
			System.out.println("Error en metodo createDepartamento:");
			e.printStackTrace();
		} finally {
			em.close();
		}

	}

	public static void updateDepartamento(Departamento Departamento) {
		try {
			em = jpaUtils.getEntityManager();
			em.getTransaction().begin();
			em.merge(Departamento);
			em.getTransaction().commit();

		} catch (Exception e) {
			System.out.println("Error en metodo updateDepartamento:");
			e.printStackTrace();
		} finally {
			em.close();
		}
	}

	public static void deleteDepartamento(int idDepartamento) {
		try {
			em = jpaUtils.getEntityManager();
			Departamento departamento = em.find(Departamento.class,
					idDepartamento);
			if (departamento != null) {
				em.getTransaction().begin();
				em.remove(departamento);
				em.getTransaction().commit();
			}
		} catch (Exception e) {
			System.out.println("Error en metodo deleteDepartamento:");
			e.printStackTrace();
		} finally {
			em.close();
		}
	}

	public static void mergeDepartamento(Departamento d) {
		try {
			em = jpaUtils.getEntityManager();
			em.getTransaction().begin();
			em.merge(d);
			em.getTransaction().commit();
		} catch (Exception e) {
			System.out.println("Error en metodo updateDepartamento:");
			e.printStackTrace();
		} finally {
			em.close();
		}
	}

}
